import java.util.Hashtable;
import java.util.LinkedList;
import java.util.logging.Level;
import java.util.logging.Logger;
import org.junit.After;
import org.junit.AfterClass;
import org.junit.Before;
import org.junit.BeforeClass;
import org.junit.Test;
import static org.junit.Assert.*;
/**
 *  Universidad del Valle de Guatemala
 *  Algoritmos y Estructura de datos.
 *  Sección 10
 *  Proyecto 3: Interprete LisP.
 *  Fecha: 11 de noviembre de 2011
 *  Descripcion: Clase que representa a una lista de elementos que van a ser evaluados
 *  por LisP.
 *  
 */

/**
 * @author Juan Fernando Medrano: 10330, Ana Debroy: 10055, Johnatan Robles: XXXXX
 * JUnits de la clase Lista.
 */
public class ListaTest  {
    
    
    public ListaTest() {
    }

    /**
     * Test of copy method, of class Lista.
     */
    @Test
    public void testCopy(){
        System.out.println("copy");
        Generico prueba = new Generico(new Atomo("(hola)"));
        Lista lista1 = new Lista();
        lista1.addLast(prueba);
        Lista result = Lista.copy(lista1);
        assertEquals(lista1.toString(), result.toString());
        System.out.println("Los valores son iguales");
        if(!lista1.equals(result)){
            assertTrue(true);
            System.out.println("No son el mismo objeto");
            System.out.println("\n");
        }
    }
    
    /**
     * Test of setTablaOperaciones method, of class Lista.
     */
    @Test
    public void testSetTablaOperaciones() {
        System.out.println("setTablaOperaciones");
        Hashtable<String, Funcion> operaciones = new Hashtable<String,Funcion>();;
        operaciones.put("+", new Funcion("+"));
        if(operaciones.containsKey("+")){
            assertTrue(true);
            System.out.println("Se guardó existosamente la función");
            System.out.print("\n");
        }
    }

    /**
     * Test of getTablaOperaciones method, of class Lista.
     */
    @Test
    public void testGetTablaOperaciones(){
        System.out.println("getTablaOperaciones");
        Hashtable<String,Funcion> lista_funciones = new Hashtable<String,Funcion>();
	Hashtable<String,Atomo> user_variables = new Hashtable<String, Atomo>();
	lista_funciones.put("+", new Funcion("+"));
        Evaluator evaluador = new Evaluator(lista_funciones,user_variables);
        if(evaluador.getTablaOperaciones().equals(lista_funciones)){
            assertTrue(true);
            System.out.println("Se obtuvo la tabla de operaciones correcta");
            System.out.println("\n");
        }
    }

    /**
     * Test of getParenthesis method, of class Lista.
     */
    @Test
    public void testGetParenthesis() throws Exception {
        System.out.println("getParenthesis");
        Lista prueba = new Lista();
        LinkedList resultado = new LinkedList();
        resultado = prueba.getParenthesis("(())");
        LinkedList esperado = new LinkedList();
        esperado.add("1, 2, 0, 3");
        assertEquals(resultado.toString(), esperado.toString());
        System.out.println("Se encontraron todas las parejas");
        System.out.println("Se econtró: "+resultado);
        System.out.println("Se esperaba: "+esperado);
        System.out.append("\n");   
    }

    /**
     * Test of verificarSiEsFuncion method, of class Lista.
     */
    @Test
    public void testVerificarSiEsFuncion() {
        System.out.println("verificarSiEsFuncion");
        Hashtable<String,Funcion> lista_funciones = new Hashtable<String,Funcion>();
	lista_funciones.put("+", new Funcion("+"));
        Lista prueba = new Lista();
        if(prueba.verificarSiEsFuncion("+")){
            assertTrue(true);
            System.out.println("Se identificó que el texto es una función guardada");
            System.out.append("\n");
        }
        
    }

   
    /**
     * Test of removeFirst method, of class Lista.
     */
    @Test
    public void testRemoveFirst() {
        System.out.println("removeFirst");
        Generico temp1= new Generico(new Atomo(0));
        Generico temp2= new Generico(new Atomo(0));
        Generico temp3= new Generico(new Atomo(0));
        Lista list = new Lista();
        list.addLast(temp1);
        list.addLast(temp2);
        list.addLast(temp3);
        assertEquals(temp1,list.removeFirst());
        
    }

    /**
     * Test of first method, of class Lista.
     */
    @Test
    public void testFirst() {
    	System.out.println("removeFirst");
        Generico temp1= new Generico(new Atomo(0));
        Generico temp2= new Generico(new Atomo(0));
        Generico temp3= new Generico(new Atomo(0));
        Lista list = new Lista();
        list.addLast(temp1);
        list.addLast(temp2);
        list.addLast(temp3);
        assertEquals(temp1,list.first());
    }

    /**
     * Test of addLast method, of class Lista.
     */
    @Test
    public void testAddLast() {
    	System.out.println("removeFirst");
        Generico temp1= new Generico(new Atomo(0));
        Generico temp2= new Generico(new Atomo(0));
        Generico temp3= new Generico(new Atomo(0));
        Lista list = new Lista();
        list.addLast(temp1);
        list.addLast(temp2);
        list.addLast(temp3);
        assertEquals(temp3,list.get(2));
    }

    /**
     * Test of rest method, of class Lista.
     */
    @Test
    public void testRest() {
    	System.out.println("removeFirst");
        Generico temp1= new Generico(new Atomo(0));
        Generico temp2= new Generico(new Atomo(0));
        Generico temp3= new Generico(new Atomo(0));
        Lista list = new Lista();
        list.addLast(temp1);
        list.addLast(temp2);
        assertEquals(temp2,list.get(1));
    }
    
    
    
}